// https://leetcode.cn/problems/group-anagrams/description/

// 题干：给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
//       字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

// 示例：输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
//       输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

// 碎语：感概于泛型编程的强大吧！

#include <bits/stdc++.h>
using namespace std;

class Solution
{
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs)
    {
        // 判断两个字符串是否为字母异位词 排序
        // 如何分组，借助哈希表<string, string[]>

        unordered_map<string, vector<string>> hash;

        // 1.把所有的字母异位词分组
        for (const auto& s : strs){
            string tmp = s;
            sort(tmp.begin(), tmp.end());
            hash[tmp].push_back(s);
        }

        // 2.把结果提取出来
        vector<vector<string>> ret;
        for (const auto& [x, y] : hash){ // 注意语法
            ret.push_back(y);
        }

        return ret;
    }
};

int main()
{
    Solution sol;
    vector<string> strs = {"eat","tea", "tan", "ate", "nat", "bat"};

    vector<vector<string>> index = sol.groupAnagrams(strs);
    for (const auto& str_s : index){
        for (const auto& str : str_s){
            cout << str << " ";
        }
        cout << endl;
    }

    return 0;
}